#import <UIKit/UIKit.h>
#import "FSRecord.h"

#define LASTUSERNAME		@"lastusername"

extern NSString * const     FSUserChangeNotification;		//用户变化通知
extern NSString * const     FSUserUpdateNotification;		//用户更新通知

extern NSString * const     FSUserScoreSumKey;				//用户总运动量，FSRecordTotal
extern NSString * const     FSUserScoreTotalKey;			//用户指定类型总运动量，FSRecordTotal

extern NSString * const     FSUserScoreLongestKey;			//用户运动最久成绩 FSUserScore
extern NSString * const     FSUserScoreFarthestKey;			//用户运动最远成绩
extern NSString * const     FSUserScore1Key;				//用户短距离成绩（跑步：5km，骑车 10km）
extern NSString * const     FSUserScore2Key;				//用户中距离成绩（跑步：10km，骑车 25km）
extern NSString * const     FSUserScore3Key;				//用户远距离成绩（跑步：21.097km，骑车 50km）
extern NSString * const     FSUserScore4Key;				//用户超远距离成绩（跑步：42.195km，骑车 100km）

typedef NS_ENUM(uint, FSUserState) {
	FSUserStateInvalid		= 0,	//失效状态（不允许用户进行任何操作，包括运动。在登录后、运动前应提示用户）
	FSUserStateTester		,		//测试员状态（运动记录不能上传至服务器，运动前应提示用户。运动完成后记录状态应设为FSRecordStateTester）
	
	FSUserStateNoraml		,		//正常状态（新用户注册成功后为此状态）
	FSUserStateVIP			,		//荣毅嘉宾（此状态用户为高质量用户，运动记录会被设为FSRecordStateExempt）
	FSUserStateAdmin		,		//管理员（可以将用户记录直接设置为异常状态，圈子管理员对已打卡的记录有此权限）
	FSUserStateSuperAdmin	,		//超级管理员（可以直接删除用户记录）
	
	//圈子成员适用以下状态
	FSMemberStateInvalid	= 0,	//成员离开圈子后的状态（成员自行离开并不从服务器删除对应记录，只是将成员状态置为此状态）
	
	FSMemberStateNormal		= 2,	//加入后，正常状态
	FSMemberStateVIP		,		//圈子特邀VIP成员
	FSMemberStateAdmin		,		//管理员状态
	FSMemberStateOwner		,		//圈子创建者状态
};

typedef NS_ENUM(uint, FSMapType) {
	FSMapTypeStandard		,		//标准地图
	FSMapTypeSatellite		,		//卫星地图
	FSMapTypeHybrid			,		//混合地图
};

typedef NS_ENUM(uint, FSUserPrivacy) {
	FSUserPrivacyPrivate	,		//不公开（不可以查看地图轨迹）
	FSUserPrivacyFriend		,		//限好友（只有好友可查看，默认）
	FSUserPrivacyPublic		,		//完全公开（任何人可看地图轨迹）
};

typedef NS_ENUM(uint, FSVoiceDistance) {
	FSVoiceFreqNoneDistance	,		//不按距离播报
	FSVoiceFreqLap			,		//每圈，400米
	FSVoiceFreqHalfUnit		,		//半单位（公制：0.5公里，英制：0.5英里）
	FSVoiceFreqUnit			,		//每单位（公制：1公里，英制：1英里）
	FSVoiceFreq2Unit		,		//２单位（公制：2公里，英制：2英里）
	FSVoiceFreq5Unit		,		//５单位（公制：5公里，英制：5英里）
};

typedef NS_ENUM(uint, FSVoiceMinute) {
	FSVoiceFreqNoneMinute	,		//不按分钟播报
	FSVoiceFreq5Minutes		,		//每5分钟
	FSVoiceFreq10Minutes	,		//每10分钟
	FSVoiceFreq15Minutes	,		//每15分钟
	FSVoiceFreq20Minutes	,		//每20分钟
	FSVoiceFreq30Minutes	,		//每30分钟
};

//用户设置
typedef struct {
	//4 bit
	uint	imperial		: 1;    //英制单位（默认0：公制单位）
	uint	screen			: 1;    //屏幕常亮（默认0：屏幕不常亮）
	uint	autoPause		: 1;	//自动暂停（默认1：自动暂停），仅支持户外运动
	uint	counter			: 1;	//室内计步器（默认0：室内关闭）
	
	//4 bit
	FSMapType		mapType	: 2;    //地图显示模式（默认0：标准模式）
	uint	filter			: 1;    //关闭过滤功能（默认0：不关闭过滤，只扫描支持的设备）
	uint	control			: 1;    //控制跑步机（默认0：禁用控制，打开后才能从APP启动，并控制速度等。）
	
	//8 bit
	FSUserPrivacy	privacy	: 2;	//隐私设置（默认1：仅好友可见）
	uint	backup			: 6;	//设置备用
	
	//8 bit
	uint	voice			: 1;    //语音提示（默认1：开启语音）此开关控制所有提示音
	FSVoiceDistance	voiceDistance	: 3;    //语音提示频率（默认2: FSVoiceFreqUnit）
	FSVoiceMinute	voiceMinute		: 3;	//按时间提示（默认0: FSVoiceFreqNoneMinute)
	uint	sndBackup		: 1;	//备用选项
	
	//8 bit
	uint	msgRequest		: 1;    //收到请求（默认1：接收消息）
	uint	msgAccept		: 1;    //请求通过（默认1：接收消息）
	uint	msgComment		: 1;    //新的评论（默认1：接收消息）
	uint	msgLike			: 1;    //新的赞　（默认0：不接收）
	uint	msgBackup		: 4;	//消息备用选项
} FSUserSettings;

//绑定平台
typedef NS_ENUM(uint, FSPlatform) {
	FSPlatformQQ			,		//QQ
	FSPlatformWechat		,		//微信
	FSPlatformSinaWeibo		,		//新浪微博
	FSPlatformTencent		,		//腾讯（微博）
	FSPlatformFacebook		,		//Facebook
	FSPlatformTwitter		,		//Twitter
};

#pragma mark - 用户成绩
@interface FSUserScore : NSObject

- (instancetype)initWithParam:(NSDictionary *)param;

@property (nonatomic, readonly) uint		rid;			//成绩对应的记录ID
@property (nonatomic, readonly) FSSportType	type;			//成绩对应运动类型

@property (nonatomic, readonly) uint		distance;		//记录距离
@property (nonatomic, readonly) uint		runtime;		//记录用时

@property (nonatomic, readonly) uint		score;			//成绩时间

@property (nonatomic, readonly) NSDate		*datetime;		//成绩创建时间

- (FSRecord *)record;		//转换为FSRecord

@end

@class FSUser, FSRecord, FSRecordTotal;
typedef void(^FSUserResult) (FSUser *user, NSError *error);
typedef void(^FSUsersResult) (NSArray<FSUser *> *users, NSError *error);
typedef void(^FSRecordsResult) (NSArray<FSRecord *> *records, NSError *error);

//运动秀用户
#pragma mark - 用户
@interface FSUser : NSObject <NSCopying>

//发现用户（按开始位置及条数获取相关用户，若成功则返回用户对象数组，数组数量小于要求条数时说明没有数据了）
+ (id)recommendWithRange:(NSRange)range result:(FSUsersResult)result;						//推荐用户
+ (id)nearbyWithRange:(NSRange)range result:(FSUsersResult)result;							//附近的人
+ (id)searchWithKey:(NSString *)key range:(NSRange)range result:(FSUsersResult)result;		//查找用户

+ (instancetype)current;		//当前登录用户
+ (BOOL)imperial;				//登录用户是否英制单位（较多地方用到，所以单独提供此类方法）
+ (BOOL)logged;					//用户是否登录

//登录或注册成功后，回调块中返回当前登录用户对象
+ (void)loginWithPlatform:(NSString *)platform result:(FSUserResult)result;		//第三方平台登录，传入平台唯一字符串
+ (void)loginWithUsername:(NSString *)username password:(NSString *)password result:(FSUserResult)result;		//普通登录

//若第三方平台登录返回未绑定的结果时，外部应启用注册机制并绑定当前第三方平台
//注册新用户，成功返回新用户对象，（若是上述第三方结果，则操作新用户对象进行相关属性设置及绑定）
+ (void)registerWithUsername:(NSString *)username nickname:(NSString *)nickname password:(NSString *)password result:(FSUserResult)result;

- (instancetype)initWithParam:(NSDictionary *)param;			//根据资料初始化用户对象

#pragma mark - 用户属性
@property (nonatomic, readonly) uint			uid;			//用户ID
@property (nonatomic, readonly)	NSString		*username;		//用户账号（在圈子或赛事中为成员名称，除登录用户外建议都使用此属性用作名称）
@property (nonatomic, readonly) FSUserState		state;			//用户状态
@property (nonatomic, readonly) uint			level;			//用户等级

//以下属性为当前用户或新建用户时可设置
@property (nonatomic, copy)		NSString		*nickname;		//用户昵称
@property (nonatomic, copy)		NSString		*signature;		//用户签名
@property (nonatomic, copy)		NSString		*summary;		//用户简介

@property (nonatomic, assign)	NSUInteger		gender;			//用户性别 0:男  1:女
@property (nonatomic, assign)	CGFloat			height;			//用户身高 cm
@property (nonatomic, assign)	CGFloat			weight;			//用户体重 kg
@property (nonatomic, copy)		NSDate			*birthday;		//用户生日
@property (nonatomic, readonly)	int				age;			//用户年龄（由生日计算）
@property (nonatomic, assign)	NSUInteger		disease;		//用户病史
@property (nonatomic, assign)	NSUInteger		interest;		//用户爱好

@property (nonatomic, assign)	NSUInteger		country;		//用户所在国家（用于过滤）
@property (nonatomic, assign)	NSUInteger		province;		//用户所在省份（用于过滤）
@property (nonatomic, assign)	NSUInteger		city;			//用户所在城市

@property (nonatomic, assign)	FSUserSettings	settings;		//用户设置值

#pragma mark - 用户数据
@property (nonatomic, readonly) FSRecordTotal	*record;
@property (nonatomic, readonly)	uint			ranking;		//用户在圈子或赛事中的排名

//当前用户设置
@property (nonatomic, readonly) BOOL			isFriend;		//当前用户是否为登录用户的好友

//图像
- (void)setImage:(UIImage *)image;			//仅编辑用户自己时有效
- (void)setCover:(UIImage *)cover;			//仅编辑用户自己时有效
//通过下面方法来异步获取，以此减少内存使用
- (id)imageWithDefault:(UIImage *)image result:(FSLoadImageResult)result;
- (id)coverWithDefault:(UIImage *)image result:(FSLoadImageResult)result;

#pragma mark - 好友管理
- (NSArray <FSUser *> *)friends;			//获取登录用户的好友列表
+ (id)refreshFriendWithResult:(FSServerResult)result;			//刷新登录用户的好友列表

#pragma mark - 用户操作
//当前用户时有效
- (id)bindPlatform:(FSPlatform)platform uid:(NSString *)uid result:(FSServerResult)result;	//绑定第三方平台
- (id)unbindPlatform:(FSPlatform)platform result:(FSServerResult)result;		//解绑第三方平台

- (void)logout;				//登出后当前用户ID为0

- (BOOL)beginEdit;			//开始编辑用户资料（仅限当前用户，备份当前资料以便取消），可以编辑时返回YES
- (void)cancelEdit;			//取消编辑（恢复编辑前的资料）

- (id)save;
- (id)saveWithResult:(FSServerResult)result;		//保存用户属性（自动判断需要保存的属性）

//用户成绩(可指定圈子，若未指定则查询用户所有记录)
- (id)scoreWithType:(NSArray <NSNumber *> *)types group:(FSGroup *)group result:(FSServerResult)result;		//获取用户服务器指定类型的成绩（包含用户总运动量、指定类型总运动量、指定类型最佳成绩）
- (id)recordWithType:(NSArray <NSNumber *> *)types group:(FSGroup *)group range:(NSRange)range result:(FSRecordsResult)result;		//获取最近（按时间到序排列）的运动记录

@end

extern FSUser	*currentUser;
